class Solution {
    //给你一个长度固定的整数数组 arr ，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。
    //注意：请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。
    //示例 1：输入：arr = [1,0,2,3,0,4,5,0] 输出：[1,0,0,2,3,0,0,4]
    //解释：调用函数后，输入的数组将被修改为：[1,0,0,2,3,0,0,4]
    //示例 2：输入：arr = [1,2,3] 输出：[1,2,3] 解释：调用函数后，输入的数组将被修改为：[1,2,3]
    public void duplicateZeros(int[] arr) {
        int len = arr.length;
        int cur = 0;
        int dest = -1;
        //1.找到最后一个需要复写的元素
        while(cur < len){
            if(arr[cur] == 0){
                dest += 2;
            }else{
                dest++;
            }
            if(dest >= len - 1){
                break;
            }
            cur++;
        }
        //此时cur对应的是需要写入数组的最后一个元素
        //2.处理边界问题
        if(dest == len){
            dest--;
            arr[dest--] = 0;
            cur--;
        }
        //3.执行复写操作
        while(cur >= 0){
            if(arr[cur] == 0){
                arr[dest--] = 0;
                arr[dest--] = 0;
                cur--;
            }else{
                arr[dest--] = arr[cur--];
            }
        }
    }
}
